package org.gradle.plugins.site; import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.plugins.site.data.EnvironmentDescriptor; import org.gradle.plugins.site.data.JavaProjectDescriptor; import org.gradle.plugins.site.data.ProjectDescriptor; import org.gradle.plugins.site.data.TaskDescriptor; import org.gradle.plugins.site.tasks.SiteGenerate; import java.io.File; /** * A plugin for generating a web page containing derived project information. * <p> * The default directory for generated web page is {@code $buildDir/docs/site}. */ public class SitePlugin implements Plugin<Project> { /** * The name of the extension for configuring the runtime behavior of the plugin. * * @see org.gradle.plugins.site.SitePluginExtension */ public static final String EXTENSION_NAME = "site"; /** * The name of task generating the web page containing derived project information. * * @see org.gradle.plugins.site.tasks.SiteGenerate */ public static final String GENERATE_SITE_TASK_NAME = "generateSite"; @Override public void apply(Project project) { SitePluginExtension sitePluginExtension = project.getExtensions().create(EXTENSION_NAME, SitePluginExtension.class, project); sitePluginExtension.setOutputDir(new File(project.getBuildDir(), "docs/site")); final SiteGenerate siteGenerateTask = createSiteTask(project, sitePluginExtension); project.afterEvaluate(new Action<Project>() { @Override public void execute(Project project) { ProjectDescriptor projectDescriptor = deriveProjectDescription(project); siteGenerateTask.setProjectDescriptor(projectDescriptor); } }); } private ProjectDescriptor deriveProjectDescription(Project project) { ProjectDescriptor projectDescriptor = new ProjectDescriptor(project.getName(), project.getGroup().toString(), project.getDescription(), project.getVersion().toString(), new EnvironmentDescriptor(project.getGradle().getGradleVersion())); addPluginDescription(project, projectDescriptor); addTasksDescription(project, projectDescriptor); addJavaDescription(project, projectDescriptor); return projectDescriptor; } private void addJavaDescription(final Project project, final ProjectDescriptor projectDescriptor) { project.getPlugins().withType(JavaPlugin.class, new Action<JavaPlugin>() { @Override public void execute(JavaPlugin javaPlugin) { JavaPluginConvention javaConvention = project.getConvention().getPlugin(JavaPluginConvention.class); projectDescriptor.setJavaProject(new JavaProjectDescriptor(javaConvention.getSourceCompatibility().toString(), javaConvention.getTargetCompatibility().toString())); } }); } private void addPluginDescription(Project project, final ProjectDescriptor projectDescriptor) { project.getPlugins().all(new Action<Plugin>() { @Override public void execute(Plugin plugin) { projectDescriptor.addPluginClass(plugin.getClass()); } }); } private void addTasksDescription(Project project, final ProjectDescriptor projectDescriptor) { project.getTasks().all(new Action<Task>() { @Override public void execute(Task task) { if (task.getGroup() != null) { projectDescriptor.addTask(new TaskDescriptor(task.getName(), task.getPath(), task.getGroup(), task.getDescription())); } } }); } private SiteGenerate createSiteTask(Project project, SitePluginExtension sitePluginExtension) { SiteGenerate generateSiteTask = project.getTasks().create(GENERATE_SITE_TASK_NAME, SiteGenerate.class); generateSiteTask.setGroup(JavaBasePlugin.DOCUMENTATION_GROUP); generateSiteTask.setDescription("Generates a web page containing information about the project."); generateSiteTask.setOutputDir(sitePluginExtension.getOutputDirProvider()); generateSiteTask.getCustomData().setWebsiteUrl(sitePluginExtension.getWebsiteUrlProvider()); generateSiteTask.getCustomData().setVcsUrl(sitePluginExtension.getVcsUrlProvider()); return generateSiteTask; } }